package com.loadburn.heron.complier;

import com.google.inject.Inject;
import com.google.inject.Provider;
import com.loadburn.heron.bind.Request;
import com.loadburn.heron.cache.WebCache;
import com.loadburn.heron.complier.mvel.Mvel2TemplateCompiler;
import com.loadburn.heron.render.adapter.HtmlRendering;
import com.loadburn.heron.render.Rendering;
import com.loadburn.heron.template.TemplateLoader;
import com.loadburn.heron.utils.HtmlParserUtils;
import com.loadburn.heron.utils.StringUtils;
import org.mvel2.templates.CompiledTemplate;

/**
 * @author slacrey (scstlinfeng@yahoo.com)
 *         Date: 13-10-29
 */
public class HeronTemplateCompilerHtml implements HeronTemplateCompiler {

    private final Provider<Request<String>> requestProvider;
    private final WebCache templateCache;

    @Inject
    public HeronTemplateCompilerHtml(Provider<Request<String>> requestProvider, Provider<WebCache> templateCacheProvider) {
        this.requestProvider = requestProvider;
        this.templateCache = templateCacheProvider.get();
    }

    @Override
    public Rendering compile(TemplateLoader.TemplatePage templatePage) {
        if (templatePage.isDecorator()) {

            String templateText = templatePage.getTemplate().getText();
            String decorateTemplateText = templatePage.getDecorateTemplate().getText();

            if (!StringUtils.empty(templateText) && !StringUtils.empty(decorateTemplateText)) {

                decorateTemplateText = HtmlParserUtils.includeDeclared(decorateTemplateText);
                templateText = HtmlParserUtils.includeDeclared(templateText);

                HtmlParserUtils htmlParserUtils = new HtmlParserUtils(templateText);
                decorateTemplateText = HtmlParserUtils.replaceBody(decorateTemplateText, htmlParserUtils.body());
                decorateTemplateText = HtmlParserUtils.replaceHead(decorateTemplateText, htmlParserUtils.head());

            }

            final CompiledTemplate compiledTemplate;
            if (!StringUtils.empty(decorateTemplateText)) {
                compiledTemplate = Mvel2TemplateCompiler.compileTemplate(decorateTemplateText, templateCache);
            } else {
                compiledTemplate = null;
            }

            return new HtmlRendering(requestProvider, compiledTemplate, templatePage);

        } else {
            final CompiledTemplate compiledTemplate = Mvel2TemplateCompiler.compileTemplate(templatePage.getTemplate().getText());
            return new HtmlRendering(requestProvider, compiledTemplate, templatePage);
        }
    }

}
